package com.wjx.demo.objExpr

open class A(a: Int) {
    open var a = a
}

interface B {
    fun say() {
        println("hello")
    }
}

//对象声明
class C {
    var a = "a"

    object D {
        fun say() {
            var b = "bb"
            //println(a)    与对象表达式不同，当对象声明在另一个类的内部时，这个对象并不能通过外部类的实例访问到该对象
            println(b)
        }
    }
}

//伴生对象 类内部的对象声明可以用 companion 关键字标记，这样它就与外部类关联在一起，我们就可以直接通过外部类访问到对象的内部元素。
//一个类里面只能声明一个内部关联对象，即关键字 companion 只能使用一次。
class F {
    companion object FF {  //可以省略FF，也可以实现接口
        fun say() {
            println("hello")
        }
    }
}

fun main(args: Array<String>) {
    //对象表达式
    var obj = object : A(1), B {
        override fun say() {
            println("b say")
        }

        override var a = 2
    }
    obj.say()
    println(obj.a)

    var obj1 = object {
        var name = "a"
        var url = "http://www.baidu.com"
        fun getValue() = url
    }
    println(obj1.name)
    println(obj1.getValue())
    //C().D.say() 错误，不能通过外部类的实例访问到该对象
    C.D.say()

    F.say()
}